package sad.controle;

import sad.util.Constantes;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.util.Vector;
import sad.dao.DAO;
import sad.dao.DisciplinaTableDAO;
import sad.dao.ProfessorTableDAO;
import sad.modelo.Disciplina;
import sad.modelo.Professor;
import sad.util.DAOEvent;
import sad.visao.CadDisciplinaDialog;
import sad.visao.DialogAbstrato;

public class DisciplinaControle extends AbstractControl {

  private CadDisciplinaDialog v_disc;

  public DisciplinaControle(DialogAbstrato v) {
    this.v_disc = (CadDisciplinaDialog)v;
    addOuvinte();
    initComponents();
  }
  
// <editor-fold defaultstate="collapsed" desc="Responde a eventos com origem nas visões">
    @Override
    public void actionPerformed(ActionEvent e) {
        
        if(e.getActionCommand().equals(Constantes.SALVAR_DISCIPLINA)){
            createDisciplina();
        }else {
            if(e.getActionCommand().equals(Constantes.EXCLUIR)){
                removeDisciplina();
            }
            if(e.getActionCommand().equals(Constantes.UPDATE)){
                updateDisciplina();
            }
            DisciplinaTableDAO.getInstance().removeDAOOuvinte(this);
            v_disc.close();
        }
    }

    @Override
    public void windowClosing(WindowEvent e){
        switch(e.getID()){
           case WindowEvent.WINDOW_CLOSING:
                DisciplinaTableDAO.getInstance().removeDAOOuvinte(this);
                v_disc.close();
                break;
        }
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Enchaminha eventos com origem no DAO">
    @Override
    public void daoChange(DAOEvent e) {
           v_disc.modelDAOChange(e);
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Métodos privados + CRUD">
    private void addOuvinte() {
        //add este controle como ouvinte da janela(v_disc) por isso parece
        //redundante na SADGUI, mas não é...
        v_disc.addActionListener(this);
        v_disc.addWindowOuvinte(this);
        DisciplinaTableDAO.getInstance().addDAOOuvinte(this);
    }
    
    private void initComponents() {
       Object[] listObjects = DAO.getListObjects(Professor.class);
       Vector<String> p = new Vector<String>();
       if (listObjects.length!=0){
           for (int i = 0; i < listObjects.length; i++) {
                Professor prof = (Professor) listObjects[i];
                p.add(prof.getNome()+"/"+prof.getLogin());
           }
           v_disc.reload(p);
       }
    }

    private void createDisciplina() {
            String nome  = v_disc.getNome();
            String abrev = v_disc.getAbreviatura();
            String p = v_disc.getProfessor();
            
            if(verificarOK(nome, abrev, p, 0)) {
                Professor prof = ProfessorTableDAO.getProfessorSaved(p);
                DisciplinaTableDAO.getInstance().create(nome, abrev, prof);
            }  
     }
    
    private void removeDisciplina() {
        DisciplinaTableDAO.getInstance().removeDisciplina();
    }

    private void updateDisciplina() {
            String nome  = v_disc.getNome();
            String abrev = v_disc.getAbreviatura();
            String p = v_disc.getProfessor();

            if(verificarOK(nome, abrev, p, 1)){
                Professor prof = ProfessorTableDAO.getProfessorSaved(p);
                Disciplina d=DisciplinaTableDAO.getDisciplinaSaved(abrev);
                d.setNome(nome);
                d.setProf(prof);
                DisciplinaTableDAO.getInstance().update(d);
            }
    }

    private boolean verificarOK(String nome, String abrev, String p,  int tipo) {
            boolean ok=false;
            if (nome.equals("")){
                DisciplinaTableDAO.getInstance().erroField(nome, Constantes.NOME_DISCIPLINA);
            }else {
                if (abrev.equals("")){
                    DisciplinaTableDAO.getInstance().erroField(abrev, Constantes.ABREV_DISCIPLINA);
                }else{
                      if (p.equals("<Lista vazia>")){
                           DisciplinaTableDAO.getInstance().erroField(p, Constantes.PROFESSOR);
                      }else{
                          if(tipo == 0){
                              Professor prof = ProfessorTableDAO.getProfessorSaved(p);
                              if(!DisciplinaTableDAO.getInstance().isExist(nome, abrev, prof)) {
                                ok = true;
                              }
                          }else{
                            ok = true;   
                          }
                    }  
                }
            }
            return ok;
    }// </editor-fold>
}
